<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>prototype</title>
</head>
<body>
    <script>
        // 原型链
        // Object类是所有对象类的基类
        // Object的.prototype 指向Object.__protot__  默认赋值null

        // 每一个函数都天生自带一个属性 prototype （包括构造函数以及类）
        // prototype 的值是一个对象 叫他的原型对象
        
        // 1. 他的原型对象上有一个值 constructor 存储的是当前函数本身

        // 2. 每一个对象都天生自带一个属性 __proto__ 指向所属类的prototype

        // 3. prototype 是函数的属性
        //      __proto__ 是对象的属性
        //      prototype 里有一个 constructor属性 是指函数本身
        //      对象 或者实例的 __proto__ 指向的是 他所属类(类是函数)(往上找一级)的 prototype

        // 从面相对象角度看内置类
        function Fn() {
        }
        // 原型重定向

        // 1.设置别名
        let proto = Fn.prototype;
        proto.getA = function() {};
        proto.getB = function() {};
        proto.getC = function() {};
        proto.getD = function() {};

        // 2.重构原型
        Fn.prototype = {
            getA: function() {},
            getB: function() {},
            getC: function() {},
            getD: function() {},
            constructor: Fn
        }
        // 问题1 重定向后 会导致 constructor 丢失 (需要手动添加)
        // 问题2 会导致 原有原型的堆内存中的属性和方法会丢失
    </script>
</body>
</html>